﻿#region << 版 本 注 释 >>
/*----------------------------------------------------------------
 * 版权所有 (c) 2022 北京超维景生物科技有限公司 保留所有权利。
 * 
 * 创建者：huangyang
 * 电子邮箱：huangyang@tvscope.cn
 * 创建时间：2023/2/23 17:56:38
 * 版本：V1.0.0
 * 描述：
 *
 * ----------------------------------------------------------------
 * 修改人：
 * 时间：
 * 修改说明：
 *
 * 版本：V1.0.1
 *----------------------------------------------------------------*/
#endregion << 版 本 注 释 >>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ImageK.Gui;
using ImageK;
using System.Windows.Forms;
using ImageK.Plugin.Frame;
using ImageK.Process;
using ImageK.Util;

namespace ImageK.Plugin
{
    /// <summary>
    /// Copies/pastes images to/from the system clipboard.
    /// </summary>
    public class Clipboard:PlugIn
    {
        private ImagePlus gImp;

        public void run(string arg)
        {
            if (IJ.altKeyDown())
            {
                if (arg.Equals("copy"))
                    arg = "scopy";
                else if (arg.Equals("paste"))
                    arg = "spaste";
            }

            if (arg.Equals("copy"))
            {
                copy(false);
            }
            else if (arg.Equals("paste"))
                paste();
            else if (arg.Equals("cut"))
                copy(true);
            // else if (arg.Equals("scopy"))
            //     copyToSystem();
            // else if (arg.Equals("showsys"))
            //     showSystemClipboard();
            // else if (arg.Equals("show"))
            //     showInternalClipboard();
        }

        /** Copies the contents of the specified image, or selection, to the system clicpboard. */
        public static void copyToSystem(ImagePlus imp)
        {
            //todo:
            // Clipboard cplugin = new Clipboard();
            // cplugin.gImp = imp;
            // cplugin.setup();
            // try
            // {
            //     cplugin.clipboard.setContents(cplugin, null);
            // }
            // catch (Exception t) { }
        }

        void copy(bool cut)
        {
            ImagePlus imp = WindowManager.getCurrentImage();
            if (imp != null)
            {
                imp.copy(cut);
                if (cut)
                    imp.changes = true;
            }
            else
                IJ.noImage();
            // if (Recorder.scriptMode())
            // {
            //     if (cut)
            //         Recorder.recordCall("imp.cut();");
            //     else
            //         Recorder.recordCall("imp.copy();");
            // }
        }

        private ImagePlus flatten(ImagePlus imp)
        {
            if (imp.getOverlay()!=null && !imp.getHideOverlay() && !imp.isHyperStack())
            {
                ImagePlus imp2 = imp;
                Roi roi = imp.getRoi();
                if (imp.getStackSize()>1)
                {
                    imp.deleteRoi();
                    int slice = imp.getCurrentSlice();
                    imp = new Duplicator().run(imp, slice, slice);
                }
                imp = imp.flatten();
                imp.setRoi(roi);
                imp2.setRoi(roi);
            }
            return imp;
        }

        void paste()
        {
            if (ImagePlus.getClipboard()==null)
                showSystemClipboard();
            else
            {
                ImagePlus imp = WindowManager.getCurrentImage();
                if (imp!=null)
                {
                    imp.paste();
                    // if (Recorder.scriptMode())
                    //     Recorder.recordCall("imp.paste();");
                }
                else
                {
                    // showInternalClipboard();
                }
            }
        }

        void setup()
        {
            // if (clipboard==null)
            //     clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        }

        void copyToSystem()
        {
            // this.gImp = WindowManager.getCurrentImage();
            // setup();
            // try
            // {
            //     clipboard.setContents(this, null);
            // }
            // catch (Throwable t) { }
            // if (Recorder.scriptMode())
            //     Recorder.recordCall("imp.copyToSystem();");
        }

        void showSystemClipboard()
        {
            setup();
            IJ.ShowStatus("Opening system clipboard...");
            try
            {
                //todo:
                // Transferable transferable = clipboard.getContents(null);
                // boolean imageSupported = transferable.isDataFlavorSupported(DataFlavor.imageFlavor);
                // boolean textSupported = transferable.isDataFlavorSupported(DataFlavor.stringFlavor);
                // if (imageSupported)
                // {
                //     Image img = (Image)transferable.getTransferData(DataFlavor.imageFlavor);
                //     if (img==null)
                //     {
                //         IJ.error("Unable to convert image on system clipboard");
                //         IJ.showStatus("");
                //         return;
                //     }
                //     int width = img.getWidth(null);
                //     int height = img.getHeight(null);
                //     BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                //     Graphics g = bi.createGraphics();
                //     g.drawImage(img, 0, 0, null);
                //     g.dispose();
                //     WindowManager.checkForDuplicateName = true;
                //     new ImagePlus("Clipboard", bi).show();
                // }
                // else if (textSupported)
                // {
                //     String text = (String)transferable.getTransferData(DataFlavor.stringFlavor);
                //     if (IJ.isMacintosh())
                //         text = Tools.fixNewLines(text);
                //     Editor ed = new Editor();
                //     ed.setSize(600, 300);
                //     ed.create("Clipboard", text);
                //     IJ.showStatus("");
                // }
                // else
                //     IJ.error("Unable to find an image on the system clipboard");
            }
            catch (Exception e)
            {
                IJ.handleException(e);
            }
        }

     //    public DataFlavor[] getTransferDataFlavors()
     //    {
     //        return new DataFlavor[] { DataFlavor.imageFlavor };
     //    }
     //
     //    public bool isDataFlavorSupported(DataFlavor flavor)
     //    {
     //        return DataFlavor.imageFlavor.equals(flavor);
     //    }
     //
     //    public Object getTransferData(DataFlavor flavor)
     //    {
		   //  if (!isDataFlavorSupported(flavor))
			  //   throw new NotImplementedException(flavor);
     //        ImagePlus imp = gImp!=null ? gImp : WindowManager.getCurrentImage();
		   //  if (imp==null)
			  //   return null;
		   //  Roi roi = imp.getRoi();
		   //  if (roi!=null && !roi.isLine()) {
			  //   Rectangle bounds = roi.getBounds();
			  //   if (!(bounds.X==0&&bounds.Y==0&&bounds.Width==imp.getWidth()&&bounds.Height==imp.getHeight()))
				 //    imp = imp.crop();
		   //  }
     //        bool overlay = imp.getOverlay()!=null && !imp.getHideOverlay();
		   //  if (overlay && !imp.tempOverlay())
			  //   imp = imp.flatten(); 
		   //  return imp.getImage();
	    // }

        void showInternalClipboard()
        {
            ImagePlus clipboard = ImagePlus.getClipboard();
            if (clipboard!=null)
            {
                ImageProcessor ip = clipboard.getProcessor();
                ImagePlus imp2 = new ImagePlus("Clipboard", ip.duplicate());
                Roi roi = clipboard.getRoi();
                imp2.deleteRoi();
                if (roi!=null && roi.isArea() && roi.getType()!=Roi.RECTANGLE)
                {
                    roi = (Roi)roi.clone();
                    roi.setLocation(0, 0);
                    imp2.setRoi(roi);
                    IJ.run(imp2, "Clear Outside", null);
                    imp2.deleteRoi();
                }
                WindowManager.CheckForDuplicateName = true;
                imp2.Show();
            }
            else
                IJ.error("The internal clipboard is empty.");
        }
    }
}
